package com.paradogs.framework.core.msg;

import com.baidu.bjf.remoting.protobuf.FieldType;
import com.baidu.bjf.remoting.protobuf.annotation.Protobuf;
import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass;
import com.paradogs.framework.core.utils.BeanUtils;
import com.paradogs.framework.core.utils.ProtoUtils;
import io.netty.buffer.ByteBuf;
import lombok.Data;

import java.io.IOException;

/**
 * @author: yumi
 * @date: 2023/2/15  21:12
 * @Description: 基础消息类，通过约定类名实现反射自动调用，
 * this 在子类使用时会指向子类对象，从而实现子类不需要实现接口就能自动转换
 */
@Data
@ProtobufClass
@Deprecated
public class BaseMsg_CmdVersion implements IMsgSerializable {


    @Protobuf(fieldType = FieldType.OBJECT, order = 1)
    private MsgHeader msgHeader;


    /**
     * 序列化（编码
     * ps: BaseMsg 的 JProtobuf 序列化时，this 指向 BaseMsg（实际运行会指向子类），无法通过编译，需要额外处理 (ProtoUtils)，
     * 不指定 Codec<> 的泛型虽然可以通过编译但是无法正确的编解码
     * @param out
     */
    @Override
    public void serialization(ByteBuf out) {

        byte[] bytes = ProtoUtils.encode(this);
        // 写入消息体
        out.writeBytes(bytes);

    }

    /**
     * 反序列化（解码）
     * @param in
     */
    @Override
    public void deserialization(ByteBuf in) throws IOException {
        // 读取消息体 byte 数组
        byte[] bytes = new byte[in.readableBytes()];
        in.readBytes(bytes);
        this.deserialization(bytes);
    }

    @Override
    public void deserialization(byte[] bytes) throws IOException {
        BaseMsg_CmdVersion msg = ProtoUtils.decode(bytes, this.getClass());
        // 将属性设置到类上
        BeanUtils.copyProperties(msg, this);
    }

}
